#ifndef BASEARMOURPLATE_H
#define BASEARMOURPLATE_H
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <vector>

using namespace cv;
using namespace std;


/*装甲板基类，用于多态模板*/
class BaseArmourPlate
{
public:
	/****************************************************************************************
	*函数名：过滤蓝光函数：whiteLightblur_blue
	*函数功能描述：过滤掉背景光，只剩蓝色光
	* 函数参数：Mat矩阵类，为未经处理的BGR图像
	* 函数返回值：Mat矩阵类，颜色过滤后的
	* 作者：温浩然、朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	*****************************************************************************************/

	virtual Mat whiteLightblur_blue(const Mat frame) = 0;

	/****************************************************************************************
	*函数名：过滤橙光函数：whiteLightblur_red
	*函数功能描述：过滤掉背景光，只剩橙色光
	* 函数参数：Mat矩阵类，为未经处理的BGR图像
	* 函数返回值：Mat矩阵类，颜色过滤后二值图
	* 作者：温浩然、朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	******************************************************************************************/

	virtual Mat whiteLightblur_red(const Mat frame) = 0;
	

	/***********************************************************************************************************************
	*函数名：预处理函数：Pretreatment
	*函数功能描述：(在基类中仅为虚函数)对图像进行初步的处理，比如降噪、二值化
	* 函数参数：Mat矩阵类，为未经处理的BGR图像
	* 函数返回值：Mat矩阵类，为处理后的二值图
	* 作者：朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	************************************************************************************************************************/
	virtual Mat Pretreatment(Mat frame) = 0;
	
	/***********************************************************************************************************************
	*函数名：卡尔曼预测函数  kalman_predict
	*函数功能描述：对当前位置点进行下一帧的预测，返回预测的坐标点
	* 函数参数：Point2f 类型点，为当前装甲板所在的位置的中心点
	* 函数返回值：基于传入的中心点的预测点
	* 作者：朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	************************************************************************************************************************/
	virtual Point2f kalman_predict(Point2f target_centre) = 0;
	
	/***********************************************************************************************************************
	*函数名：卡尔曼滤波初始化  kalman_init
	*函数功能描述：对卡尔曼滤波需要的几个参数进行初始化
	* 函数参数：无
	* 函数返回值：无
	* 作者：朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	************************************************************************************************************************/
	virtual void kalman_init() = 0;
	
	/***********************************************************************************************************************
    *函数名：筛选函数：Screen
    *函数功能描述：从所有矩形轮廓中筛除出不可能是装甲板轮廓的矩形
    * 函数参数：处理好的二值图
    * 函数返回值：vector<vector<Point>>，点集，也就是轮廓信息
    * 作者：温浩然
    * 修改日期：暂无
    * 修改原因：暂无
    ************************************************************************************************************************/
	
	virtual vector<vector<Point>> Screen(Mat pic) = 0;

	/***********************************************************************************************************************
	* 函数名：装甲板匹配函数
	* 函数功能描述：在初步筛选的众多类灯条轮廓中进行匹配，得出装甲板
	* 函数参数：vector<vector<Point>>类型（轮廓）的引用
	* 函数返回值：元素为<Rect>的vector容器
	* 作者：朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	************************************************************************************************************************/
	virtual vector<Rect> matchingForArmo(vector<vector<Point>>& contours) = 0;
	
	/***********************************************************************************************************************
	* 函数名：接口函数begin
	* 函数功能描述：依照顺序调用类中各模块函数，自动完成对装甲板的一系列操作
	* 函数参数：无
	* 函数返回值：无
	* 作者：朱荣辉
	* 修改日期：暂无
	* 修改原因：暂无
	************************************************************************************************************************/
	
	//void Begin();
};

#endif
